package main

import (
	"bufio"
	"bytes"
	"encoding/json"
	"fmt"
	"io/ioutil"
	"net/http"
	"os"
	"strconv"
	"strings"
	"time"
)

// 客户端请求结构
type ClientRequest struct {
	Query string `json:"query"`
}

// 客户端响应结构
type ClientResponse struct {
	Result string `json:"result"`
}

// MCP客户端配置
type ClientConfig struct {
	ServerURL string
	Timeout   time.Duration
}

// 测试用例结构
type TestCase struct {
	Name        string
	Query       string
	Description string
}

// 预定义测试用例
var testCases = []TestCase{
	{
		Name:        "用户使用量查询-1",
		Query:       "查询用户12345的使用情况",
		Description: "测试基本的用户使用量查询",
	},
	{
		Name:        "用户使用量查询-2",
		Query:       "用户67890已使用费用",
		Description: "测试费用查询关键词",
	},
	{
		Name:        "用户使用量查询-3",
		Query:       "用户11111的流量使用量",
		Description: "测试流量查询关键词",
	},
	{
		Name:        "用户使用量查询-4",
		Query:       "查看用户22222的余额",
		Description: "测试余额查询关键词",
	},
	{
		Name:        "用户使用量查询-5",
		Query:       "用户33333的使用时长",
		Description: "测试时长查询关键词",
	},
	{
		Name:        "用户信息查询-1",
		Query:       "用户55555的联系方式",
		Description: "测试用户信息查询",
	},
	{
		Name:        "用户信息查询-2",
		Query:       "查询用户66666的电话",
		Description: "测试电话查询关键词",
	},
	{
		Name:        "无效查询-1",
		Query:       "今天天气怎么样",
		Description: "测试不支持的查询类型",
	},
	{
		Name:        "无效查询-2",
		Query:       "用户信息",
		Description: "测试缺少用户ID的查询",
	},
}

func main() {
	config := ClientConfig{
		ServerURL: "http://localhost:8080",
		Timeout:   30 * time.Second,
	}

	fmt.Println("🚀 MCP交互式测试客户端")
	fmt.Println("========================")
	fmt.Printf("服务器地址: %s\n", config.ServerURL)
	fmt.Println()

	reader := bufio.NewReader(os.Stdin)

	for {
		showMenu()

		fmt.Print("请选择操作 (1-4): ")
		choice, _ := reader.ReadString('\n')
		choice = strings.TrimSpace(choice)

		switch choice {
		case "1":
			runAllTests(config)
		case "2":
			runSpecificTest(config, reader)
		case "3":
			runCustomQuery(config, reader)
		case "4":
			fmt.Println("👋 再见！")
			return
		default:
			fmt.Println("❌ 无效选择，请重试")
		}

		fmt.Println()
	}
}

func showMenu() {
	fmt.Println("📋 选择测试模式:")
	fmt.Println("1. 运行所有预设测试用例")
	fmt.Println("2. 运行指定测试用例")
	fmt.Println("3. 自定义查询")
	fmt.Println("4. 退出")
	fmt.Println()
}

func runAllTests(config ClientConfig) {
	fmt.Println("🧪 运行所有测试用例...")
	fmt.Println(strings.Repeat("=", 50))

	passed := 0
	failed := 0

	for i, testCase := range testCases {
		fmt.Printf("\n[%d/%d] %s\n", i+1, len(testCases), testCase.Name)
		fmt.Printf("描述: %s\n", testCase.Description)
		fmt.Printf("查询: %s\n", testCase.Query)
		fmt.Println(strings.Repeat("-", 40))

		result, err := sendQuery(config, testCase.Query)
		if err != nil {
			fmt.Printf("❌ 错误: %v\n", err)
			failed++
		} else {
			fmt.Printf("✅ 响应: %s\n", result.Result)
			passed++
		}
	}

	fmt.Printf("\n📊 测试结果统计:\n")
	fmt.Printf("✅ 通过: %d\n", passed)
	fmt.Printf("❌ 失败: %d\n", failed)
	fmt.Printf("📈 成功率: %.1f%%\n", float64(passed)/float64(len(testCases))*100)
}

func runSpecificTest(config ClientConfig, reader *bufio.Reader) {
	fmt.Println("📝 选择测试用例:")
	fmt.Println(strings.Repeat("-", 40))

	for i, testCase := range testCases {
		fmt.Printf("%d. %s\n", i+1, testCase.Name)
		fmt.Printf("   查询: %s\n", testCase.Query)
		fmt.Printf("   描述: %s\n", testCase.Description)
		fmt.Println()
	}

	fmt.Printf("请选择测试用例 (1-%d): ", len(testCases))
	choice, _ := reader.ReadString('\n')
	choice = strings.TrimSpace(choice)

	index, err := strconv.Atoi(choice)
	if err != nil || index < 1 || index > len(testCases) {
		fmt.Println("❌ 无效选择")
		return
	}

	testCase := testCases[index-1]
	fmt.Printf("\n🧪 执行测试: %s\n", testCase.Name)
	fmt.Printf("查询: %s\n", testCase.Query)
	fmt.Println(strings.Repeat("-", 40))

	result, err := sendQuery(config, testCase.Query)
	if err != nil {
		fmt.Printf("❌ 错误: %v\n", err)
	} else {
		fmt.Printf("✅ 响应: %s\n", result.Result)
	}
}

func runCustomQuery(config ClientConfig, reader *bufio.Reader) {
	fmt.Println("✏️  自定义查询模式")
	fmt.Println(strings.Repeat("-", 30))
	fmt.Println("支持的查询类型:")
	fmt.Println("• 用户使用量: 查询用户[ID]的使用情况/费用/时长/流量/余额")
	fmt.Println("• 用户信息: 用户[ID]的联系方式/电话")
	fmt.Println("• 输入 'quit' 返回主菜单")
	fmt.Println()

	for {
		fmt.Print("请输入查询语句: ")
		query, _ := reader.ReadString('\n')
		query = strings.TrimSpace(query)

		if query == "quit" {
			break
		}

		if query == "" {
			fmt.Println("❌ 查询不能为空")
			continue
		}

		fmt.Printf("🔍 查询: %s\n", query)
		fmt.Println(strings.Repeat("-", 30))

		result, err := sendQuery(config, query)
		if err != nil {
			fmt.Printf("❌ 错误: %v\n", err)
		} else {
			fmt.Printf("✅ 响应: %s\n", result.Result)
		}
		fmt.Println()
	}
}

func sendQuery(config ClientConfig, query string) (*ClientResponse, error) {
	// 构造请求
	req := ClientRequest{Query: query}
	jsonData, err := json.Marshal(req)
	if err != nil {
		return nil, fmt.Errorf("序列化请求失败: %v", err)
	}

	// 显示请求详情
	fmt.Printf("📤 发送请求到: %s/mcp/query\n", config.ServerURL)
	fmt.Printf("📝 请求体: %s\n", string(jsonData))

	// 创建HTTP客户端
	client := &http.Client{Timeout: config.Timeout}

	// 发送POST请求
	resp, err := client.Post(
		config.ServerURL+"/mcp/query",
		"application/json",
		bytes.NewBuffer(jsonData),
	)
	if err != nil {
		return nil, fmt.Errorf("发送请求失败: %v", err)
	}
	defer resp.Body.Close()

	// 读取响应
	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		return nil, fmt.Errorf("读取响应失败: %v", err)
	}

	fmt.Printf("📥 响应状态: %s\n", resp.Status)
	fmt.Printf("📄 响应体: %s\n", string(body))

	// 检查HTTP状态码
	if resp.StatusCode != http.StatusOK {
		return nil, fmt.Errorf("服务器错误: %s, 响应: %s", resp.Status, string(body))
	}

	// 解析响应
	var result ClientResponse
	if err := json.Unmarshal(body, &result); err != nil {
		return nil, fmt.Errorf("解析响应失败: %v", err)
	}

	return &result, nil
}
